#ifndef RECORD_HPP
#define RECORD_HPP

#include <opencv2/opencv.hpp>
#include <rk_mpi.h>
#include <mpp_buffer.h>
#include <mpp_frame.h>
#include <mpp_packet.h>
#include <mpp_enc.h>
#include <mutex>
extern "C"{
    #include <libavformat/avformat.h>
    #include <libavutil/timestamp.h>
};

/****************************************************************************
** 文件名：record.hpp
** 作者：未知
** 日期：2025-06-13
** 描述：录屏模块的头文件，声明录屏初始化、录制和关闭函数，使用MPP硬件编码
****************************************************************************/

// MPP编码上下文结构体
typedef struct {
    MppCtx ctx;
    MppApi *mpi;
    MppBufferGroup buf_grp;
    MppEncCfg cfg;
    int width;
    int height;
    int hor_stride;
    int ver_stride;
    AVFormatContext *fmt_ctx; // FFmpeg格式上下文
    AVStream *video_stream;   // 视频流
    int64_t pts;              // 当前PTS
} MppEncContext;

/****************************************************************************
** 函数名：record_init
** 输入参数：
**   width - 录制视频的宽度（像素）
**   height - 录制视频的高度（像素）
**   output_file - 输出视频文件路径
** 输出参数：
**   无
** 返回值：
**   0 - 成功
**   -1 - 失败
** 功能描述：
**   初始化MPP硬件编码环境，设置编码器和输出格式。
****************************************************************************/
int record_init(uint32_t width, uint32_t height, const char* output_file);

/****************************************************************************
** 函数名：record_frame
** 输入参数：
**   frame - 输入图像，OpenCV Mat对象，格式为CV_8UC3
** 输出参数：
**   无
** 返回值：
**   0 - 成功
**   -1 - 失败
** 功能描述：
**   将一帧图像编码并写入视频文件，使用MPP硬件编码。
****************************************************************************/
int record_frame(const cv::Mat& frame);

/****************************************************************************
** 函数名：record_close
** 输入参数：
**   无
** 输出参数：
**   无
** 返回值：
**   无
** 功能描述：
**   停止录制并释放MPP资源。
****************************************************************************/
void record_close();

#endif